package com.cloudbroker.bcs.platform.ltb.common.util;

import com.cloudbroker.bcs.common.util.ValueUtil;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.write.*;
import jxl.write.Number;
import jxl.write.biff.RowsExceededException;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.Vector;

public class ExcelOut {
	public static void exportToExcel(HttpServletResponse res, String fileName, String sheetname, String[] titles,
									 Vector<?> vect, BigDecimal record_count, BigDecimal reward_count, BigDecimal viewpoint_read,
									 BigDecimal question_reward, BigDecimal comment) throws Exception {
		OutputStream os = null;
		try {
			os = res.getOutputStream(); // 取得输出流
			res.reset(); // 清空输出流
			res.setHeader("Content-disposition",
					"attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF8") + ".xls"); // 设定输出文件头
			res.setContentType("application/msexcel"); // 定义输出类型
		} catch (IOException ex) {
			System.out.println("流操作错误:" + ex.getMessage());
		}
		WritableWorkbook workbook = null;
		try {
			// 创建新的Excel
			workbook = Workbook.createWorkbook(os);
			// 在Excel工作簿中建一工作表，其名为:第一页
			WritableSheet wsheet = workbook.createSheet(sheetname, 0); // sheet();
			// 基本的就是创建一个 工作簿Excel.---> 然后就是这个Excel的页.--->最后写入数据.
			// 设置每一列的宽度.第一个参数是列,第二个是多宽按厘米记,
			wsheet.setColumnView(0, 30);// 第1列
			wsheet.setColumnView(1, 30);// 第2列
			wsheet.setColumnView(2, 30);// 第3列
			wsheet.setColumnView(3, 30);// 第4列

			WritableFont font = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false,
					jxl.format.UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
			WritableCellFormat format = new WritableCellFormat(font);
			format.setAlignment(Alignment.CENTRE);
			WritableFont valuefont = new WritableFont(WritableFont.createFont("宋体"), 12, WritableFont.NO_BOLD,
					false, jxl.format.UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
			WritableCellFormat valueformat = new WritableCellFormat(valuefont);
			// 总数
			Integer line = 0;
			putSumLine("记录总数", line, record_count, wsheet, valueformat);
			line++;
			putSumLine("打赏金币总数", line, reward_count, wsheet, valueformat);
			line++;
			putSumLine("观点说阅读", line, viewpoint_read, wsheet, valueformat);
			line++;
			putSumLine("问与答打赏", line, question_reward, wsheet, valueformat);
			line++;
			putSumLine("实时评打赏", line, comment, wsheet, valueformat);
			line++;

			for (int i = 0; i < titles.length; i++) {
				Label wlabel2 = new Label(i, line, String.valueOf(titles[i]), format); // 行、列、单元格中的文本、文本格式
				wsheet.addCell(wlabel2);
			}
			line++;

			for (int i = line; i < vect.size() + line; i++) { // 在索引0的位置创建行（最顶端的行）
				Object[] sdata = (Object[]) vect.elementAt(i - line);
				for (int j = 0; j < sdata.length; j++) { // 在索引0的位置创建单元格（左上端）
					if (j == 3) {
						Number number = new Number(j, i, ValueUtil.getInt(sdata[j], 0)); // 只保存2位小数
						wsheet.addCell(number);
					} else if (j == 2) {
						String dashang = "";
						switch (ValueUtil.getInt(sdata[j], -1)) {
							case 0:
								dashang = "观点阅读";
								break;
							case 1:
								dashang = "观点打赏";
								break;
							case 2:
								dashang = "实时评打赏";
								break;
							case 3:
							    dashang = "问与答打赏";
							    break;
							default:
								break;
						}
						Label wlabel = new Label(j, i, dashang, valueformat); // 行、列、单元格中的文本、文本格式
						wsheet.addCell(wlabel);
					} else if (j == 0) {

						//Long dateTime = ValueUtil.getLongObj(sdata[j], -1l);
						String dateTime = (String) sdata[j] ;
						//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
						String date = "";
						try {
							//date = sdf.format(dateTime);
							date = dateTime.substring(0, dateTime.length()-2);
						} catch (Exception e) {
							date = "";
						}
						Label wlabel = new Label(j, i, date, valueformat); // 行、列、单元格中的文本、文本格式
						wsheet.addCell(wlabel);
					} else {
						Label wlabel = new Label(j, i, ValueUtil.getString(sdata[j]), valueformat); // 行、列、单元格中的文本、文本格式
						wsheet.addCell(wlabel);
					}
				}
			}
			workbook.write(); // 写入文件
		} catch (WriteException ex1) {
			System.out.println("WriteException:" + ex1.getMessage());
		} catch (IOException ex2) {
			System.out.println("IOException:" + ex2.getMessage());
		} finally {
			if (workbook != null) {
				workbook.close();
			}
			if (os != null) {
				os.close();
			}
		}
	}
	// 这里定义一个公共的方法,导出Excel文件.
	public static void exportToExcel(HttpServletResponse res, String fileName, String sheetname, String[] titles,
			Vector<?> vect, Integer record_count, Double reward_count) throws Exception {
		OutputStream os = null;
		try {
			os = res.getOutputStream(); // 取得输出流
			res.reset(); // 清空输出流
			res.setHeader("Content-disposition",
					"attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8") + ".xls"); // 设定输出文件头
			res.setContentType("application/msexcel"); // 定义输出类型
		} catch (IOException ex) {
			System.out.println("流操作错误:" + ex.getMessage());
		}
		WritableWorkbook workbook = null;
		try {
			// 创建新的Excel
			workbook = Workbook.createWorkbook(os);
			// 在Excel工作簿中建一工作表，其名为:第一页
			WritableSheet wsheet = workbook.createSheet(sheetname, 0); // sheet();
			// 基本的就是创建一个 工作簿Excel.---> 然后就是这个Excel的页.--->最后写入数据.
			// 设置每一列的宽度.第一个参数是列,第二个是多宽按厘米记,
			wsheet.setColumnView(0, 30);// 第1列
			wsheet.setColumnView(1, 30);// 第2列
			wsheet.setColumnView(2, 30);// 第3列
			wsheet.setColumnView(3, 30);// 第4列

			WritableFont font = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false,
					jxl.format.UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
			WritableCellFormat format = new WritableCellFormat(font);
			format.setAlignment(Alignment.CENTRE);
			WritableFont valuefont = new WritableFont(WritableFont.createFont("宋体"), 12, WritableFont.NO_BOLD,
					false, jxl.format.UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
			WritableCellFormat valueformat = new WritableCellFormat(valuefont);
			NumberFormat nf = new NumberFormat("0.00"); // 设定带小数点数字格式
			WritableCellFormat doublevaluefont = new WritableCellFormat(valuefont, nf);// 设定带小数数字单元格格式
			// 总数
			Label wlabel0 = new Label(0, 0, "记录总数", valueformat);
			Number record_count_value = new Number(1, 0, record_count);
			wsheet.addCell(record_count_value);
			wsheet.addCell(wlabel0);
			Label wlabel1 = new Label(0, 1, "打赏金币总数", valueformat);
			wsheet.addCell(wlabel1);
			Number reward_count_value = new Number(1, 1, reward_count, doublevaluefont);
			wsheet.addCell(reward_count_value);

			for (int i = 0; i < titles.length; i++) {
				Label wlabel2 = new Label(i, 2, String.valueOf(titles[i]), format); // 行、列、单元格中的文本、文本格式
				wsheet.addCell(wlabel2);
			}

			for (int i = 3; i < vect.size() + 3; i++) { // 在索引0的位置创建行（最顶端的行）
				Object[] sdata = (Object[]) vect.elementAt(i - 3);
				for (int j = 0; j < sdata.length; j++) { // 在索引0的位置创建单元格（左上端）
					if (j == 3) {
						Number number = new Number(j, i, ValueUtil.getDouble(sdata[j]), doublevaluefont); // 只保存2位小数
						wsheet.addCell(number);
					} else {
						Label wlabel = new Label(j, i, ValueUtil.getString(sdata[j]), valueformat); // 行、列、单元格中的文本、文本格式
						wsheet.addCell(wlabel);
					}

				}
			}
			workbook.write(); // 写入文件
			workbook.close();
			os.close();
		} catch (WriteException ex1) {
			System.out.println("WriteException:" + ex1.getMessage());
		} catch (IOException ex2) {
			System.out.println("IOException:" + ex2.getMessage());
		}
		// res.flushBuffer();
	}
	private static void putSumLine(String title, Integer lineNum, BigDecimal value, WritableSheet wsheet,
								   WritableCellFormat valueformat) throws WriteException, RowsExceededException {
		Label wlabel = new Label(0, lineNum, title, valueformat);
		Number record_count_value = new Number(1, lineNum, value.setScale(0).doubleValue());
		wsheet.addCell(record_count_value);
		wsheet.addCell(wlabel);
	}
}
